package com.woniuxy.project115.kaer.commons.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

/**
 * @author HuH
 * @version 1.0
 * @CreatTime 2024-11-15 17:46
 * @description 阿里云OSS工具类
 */
@Data
public class OSSUtil {
    //节点域名
    private static String host = "oss-cn-chengdu.aliyuncs.com";

    //账号的身份ID
    private static String accessId = "LTAI5tECRTBuNEwLrph3TJoX";

    //账号的身份凭证
    private static String accessSecret= "JUVUOv5EwWxsZrREzV1pdSjj2JTpuv";

    /**
     * 上传文件
     * @param file 文件数据
     * @param name 文件名
     * @param bucketName 存储空间名
     * @return 文件的访问地址
     */
    public static String uploadFile(InputStream file, String name, String bucketName) {
        //创建客户端对象
        OSS ossClient = new OSSClientBuilder().build(
                "https://"+host, accessId, accessSecret);
        try {
            //上传
            ossClient.putObject(bucketName, name, file);
        } finally {
            if(ossClient != null) ossClient.shutdown();
        }
        return "https://" + bucketName + "."+ host + "/"+name;
    }

    /**
     * 删除文件
     * @param bucketName 存储空间名
     * @param name 文件名
     * @return
     */
    public static boolean deleteFile(String bucketName, String name) {
        OSS ossClient = new OSSClientBuilder().build(
                "https://"+host, accessId, accessSecret);
        try {
            //删除文件
            ossClient.deleteObject(bucketName, name);
        } finally {
            if(ossClient != null) ossClient.shutdown();
        }
        return true;
    }

    /**
     * 检查文件扩展名是否为.doc
     *
     * @param file MultipartFile 文件对象
     * @return 如果文件扩展名为.doc，则返回true；否则返回false
     */
    private static boolean isDocFileBasedOnExtension(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            return false;
        }
        return originalFilename.toLowerCase().endsWith(".doc");
    }

    /**
     * 尝试通过查找特定字符串来判断是否为.doc文件
     *
     * @param file MultipartFile 文件对象
     * @return 如果文件内容包含特定的字符串（如"Word.Document"），则返回true；否则返回false
     */
    private static boolean mightBeDoc(MultipartFile file) {
        if (file.isEmpty() || file.getSize() < 8) {
            return false;
        }

        try {
            byte[] fileContent = file.getBytes();
            String contentStr = new String(fileContent, StandardCharsets.ISO_8859_1); // 或者使用其他合适的字符集
            return contentStr.contains("Word.Document") || contentStr.contains("Microsoft Word");
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 综合判断文件是否为.doc文件
     *
     * @param file MultipartFile 文件对象
     * @return 如果文件扩展名为.doc并且文件内容包含特定的字符串，则返回true；否则返回false
     */
    public static boolean isDoc(MultipartFile file) {
        return isDocFileBasedOnExtension(file) && mightBeDoc(file);
    }

    // 判断是否为DOCX文件
    public static boolean isDocx(byte[] header) {
        return header.length >= 4 && header[0] == 0x50 && header[1] == 0x4B && header[2] == 0x03 && header[3] == 0x04;
    }

    public static boolean isPdf(byte[] header) {
        return header[0] == 0x25 && header[1] == 0x50 && header[2] == 0x44 && header[3] == 0x46;
    }

    public static boolean isGif(byte[] header) {
        return header[0] == 'G' && header[1] == 'I' && header[2] == 'F' && header[3] == '8';
    }

    public static boolean isPng(byte[] header) {
        return header[0] == (byte) 0x89 && header[1] == (byte) 0x50 && header[2] == (byte) 0x4E
                && header[3] == (byte) 0x47;
    }

    public static boolean isJpg(byte[] header) {
        return header[0] == (byte) 0xFF && header[1] == (byte) 0xD8;
    }
}
